package com.hgsoft.pubsv.component.apifilter;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.web.bind.annotation.Mapping;

/**
 * 标准请求数据加解密注解<BR/>
 * 支持GET、POST、DELTET、PUT<BR/>
 * 统一定义请求参数格式<BR/>
 * 	属性				描述					类型			必填<BR/>
	accessNo		渠道编码				String		是<BR/>
	format			数据格式				String		是<BR/>
	charset			请求使用的编码格式	String		是<BR/>
	encryptType		加密算法				String		是<BR/>
	timestamp		发送请求的时间		String		是<BR/>
	version			版本号				String		是<BR/>
	bizContent		请求参数加密串		String		是<BR/>
 * 统一定义响应格式(ApiRespDto)<BR/>
 * 	属性				描述					类型			必填<BR/>
	code			返回码				String		是<BR/>
	receiveTime		数据返回时间			String		是<BR/>
	bizContent		返回数据加密串		String		否<BR/>
 * 使用说明<BR/>
 * 1、controller方法中添加@SecurityParam注解表示启用标准请求参数加解密，请求响应格式需按如上统一格式定义参数格式传输<BR/>
 * 2、添加@SecurityParam后controller方法bizContent中的参数会自动解析成明文请求参数，controller直接采用@RequestParam、@RequestBody接受即可(暂不支持@PathVariable)<BR/>
 * 3、@SecurityParam默认入参解密，如需入参不解密则可通过@SecurityParam(inDecode=false)设置<BR/>
 * 4、@SecurityParam默认出灿加密，如需出参不加密则可通过@SecurityParam(outEncode=false)设置<BR/>
 * 5、@SecurityParam默认需要登录token校验，此时入参bizContent中需要携带clientKey(客户端编码)、tokenId(登录token)，如不需要登录token校验则可通过@SecurityParam(needCheckToken=false)设置<BR/>
 * 6、@SecurityParam(ignoreParamter="a:b")可以设置加解密的时候忽略一些参数不加解密,例如一些大字段，建议不用加解密<BR/>
 * 8、@SecurityParam(needCheckTime=true) 设置是否入参校验时间戳，需要时需带上请求参数，系统会校验时间有效期，时间超过一定范围不处理，默认需要<BR/>
 * 9、@SecurityParam(encryptType="") 设置方法只支持AES或者RSA或者RSAWITHAES，默认支持所有，推荐使用RSAWITHAES<BR/>
 * 10、AES加密密钥在xxl-conf中配置，格式encryption.aes.channel.+"入参accessNo"<BR/>
 * 11、RSA加密密钥在xxl-conf中配置，<BR/>
 * 	  系统rsa根私钥格式encryption.rsa.rootprivate.key.channel.+"入参accessNo"<BR/>
 * 	  渠道rsa公钥格式encryption.rsa.publickey.channel.+"入参accessNo"<BR/>
 * PS:文件默认不加解密(MultipartFile)<BR/>
 * 接口定义详见《公众服务平台接口请求说明.docx》<BR/>
 * @author saint
 */
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Mapping
@Documented
public @interface SecurityParam {
	
	String value() default "";
	
    /**
     * 是否不启用过滤
     */
    boolean notFilter() default false;

    /**
     * 入参是否解密，默认解密
     */
    boolean inDecode() default true;

    /**
     * 出参是否加密，默认加密
     */
    boolean outEncode() default true;

    /**
     * 是否需要登录token校验，默认需要
     * @return
     */
    boolean needCheckToken() default true;

    /**
     * 是否需要校验时间戳，默认需要
     * 需要时需带上请求参数，系统会校验时间有效期，时间超过一定范围不处理
     * @return
     */
    boolean needCheckTime() default true;

    /**
     * 忽略加密解密参数 按:分割 例a:b
     * @return
     */
    String ignoreParameter() default "";

    /**
     * 加解密方法,支持AES或者RSA或者RSAWITHAES，默认支持所有
     * @return
     */
    String encryptType() default "";
    
    /**
     * 是否开启ipLimit，同一IP才能访问一次接口，默认不需要
     * @return
     */
    boolean ipLimit() default false;
    
    /**
     * 获取IP限制时间范围 单位秒
     */
    int ipLimitPeriod() default 300;
    
    /**
     * 获取IP限制访问次数
     */
    int ipLimitCount() default 3;
    
}
